package org.deng.learn.mybatis.java;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.deng.learn.mybatis.entity.User;
import org.deng.learn.mybatis.java.mapper.UserMapper;
import org.deng.learn.mybatis.java.mapper.UserMapper2;


import java.sql.SQLException;
import java.util.List;

/**
 * @Author DengLibin
 * @Date 19-4-27
 * @Time 下午10:45
 * @Desc 数据库访问
 */
public class UserDao {

    private SqlSessionFactory sessionFactory = SingletonFactory.getSqlSessionFactory();

    public List<User> query() throws SQLException {
        /**
         * 每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的，因此是不能被共享的，所以它的最佳的作用域是请求或方法作用域。
         * 绝对不能将 SqlSession 实例的引用放在一个类的静态域，甚至一个类的实例变量也不行
         */
        SqlSession sqlSession = sessionFactory.openSession();
        try{
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            System.out.println("UserMapper实现类:" + mapper.getClass().getName());//动态代理类
            List<User> list = mapper.query();
            sqlSession.commit();
            return list;
        }finally {
            sqlSession.close();
        }


    }
    public List<User> queryByCommonMapper() throws SQLException {
        /**
         * 每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的，因此是不能被共享的，所以它的最佳的作用域是请求或方法作用域。
         * 绝对不能将 SqlSession 实例的引用放在一个类的静态域，甚至一个类的实例变量也不行
         */
        SqlSession sqlSession = sessionFactory.openSession();
        try{
            UserMapper2 mapper = sqlSession.getMapper(UserMapper2.class);
            List<User> list = mapper.selectAll();
            sqlSession.commit();
            return list;
        }finally {
            sqlSession.close();
        }


    }

    public int update(User user)   {
        SqlSession sqlSession = sessionFactory.openSession();
        try{
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            int i = mapper.update(user);
            sqlSession.commit(); //手动提交
            return i;
        }catch (Exception e){
            e.printStackTrace();
            sqlSession.rollback();
        }finally {
            sqlSession.close();
        }
        return 0;
    }
}
